home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / c / asyncio.lha / AsyncIO / src / WriteAsync.c < prev    next >
C/C++ Source or Header  |  1995-09-10  |  1KB  |  55 lines

  1. #include "async.h"
  2.  
  3. LibCall LONG
  4. WriteAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buffer, _REG( d0 ) LONG numBytes )
  5. {
  6. #ifdef ASIO_NOEXTERNALS
  7.     struct ExecBase    *SysBase;
  8. #endif
  9.     LONG totalBytes;
  10.  
  11. #ifdef ASIO_NOEXTERNALS
  12.     SysBase = file->af_SysBase;
  13. #endif
  14.  
  15.     /* this takes care of NIL: */
  16.     if( !file->af_Handler )
  17.     {
  18.         file->af_Offset        = file->af_Buffers[ 0 ];
  19.         file->af_BytesLeft    = file->af_BufferSize;
  20.         return( numBytes );
  21.     }
  22.  
  23.     totalBytes = 0;
  24.  
  25.     while( numBytes > file->af_BytesLeft )
  26.     {
  27.         if( file->af_BytesLeft )
  28.         {
  29.             CopyMem( buffer, file->af_Offset, file->af_BytesLeft );
  30.  
  31.             numBytes    -= file->af_BytesLeft;
  32.             buffer        =  ( APTR ) ( ( ULONG ) buffer + file->af_BytesLeft );
  33.             totalBytes    += file->af_BytesLeft;
  34.         }
  35.  
  36.         if( AS_WaitPacket( file ) < 0 )
  37.         {
  38.             return( -1 );
  39.         }
  40.  
  41.         /* send the current buffer out to disk */
  42.         AS_SendPacket( file, file->af_Buffers[ file->af_CurrentBuf ] );
  43.  
  44.         file->af_CurrentBuf    = 1 - file->af_CurrentBuf;
  45.         file->af_Offset        = file->af_Buffers[ file->af_CurrentBuf ];
  46.         file->af_BytesLeft    = file->af_BufferSize;
  47.     }
  48.  
  49.     CopyMem( buffer, file->af_Offset, numBytes );
  50.     file->af_BytesLeft    -= numBytes;
  51.     file->af_Offset        =  ( APTR ) ( ( ULONG ) file->af_Offset + numBytes );
  52.  
  53.     return ( totalBytes + numBytes );
  54. }
  55.